package cn.highedu.coolsharkhub.controller;

import cn.highedu.coolsharkhub.entity.dto.UserLoginDTO;
import cn.highedu.coolsharkhub.entity.vo.UserVO;
import cn.highedu.coolsharkhub.service.UserService;
import cn.highedu.coolsharkhub.service.exception.BlankParameterException;
import cn.highedu.coolsharkhub.service.exception.UserNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

/**
 * 用户控制层
 */
//@Controller // 控制层声明
@RestController // 控制层声明 同时类中所有方法都使用了@ResponseBody注解
public class UserController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    // 注入用户业务层实例
    @Autowired
    UserService userService;

    /**
     * 用户登录方法
     * 如果登录成功 返回用户登录结果
     * 访问该方法 需要发送POST请求
     * @param userLoginDTO 用户信息传输对象
     * @return 登录结果
     */
    //@RequestMapping(value = "/users/login", method = RequestMethod.POST) // 只接收POST请求
    @PostMapping("/users/login") // 只接收POST请求
    public String login(@RequestBody UserLoginDTO userLoginDTO, HttpSession session) { // @RequestBody注解声明参数是请求体的一部分
        logger.info("userLoginDTO: {}", userLoginDTO);
        // 获取用户名和密码
        String username = userLoginDTO.getUsername();
        String password = userLoginDTO.getPassword();
        // 调用业务方法
        UserVO userVO = userService.login(username, password);
        // 把用户信息保存在session中
        session.setAttribute("user", userVO);
        return "登录成功";
    }
    /**
     * 用户退出登录
     */
    @GetMapping("/users/logout")
    public String logout(HttpSession session) {
        // 清空session
        session.invalidate();
        return "退出成功";
    }

    /**
     * 用户成功登录之后 查看用户信息
     */
    @GetMapping("/users/current")
    public String getCurrentUsername(HttpSession session) {
        // 从session中获取用户数据
        UserVO userVO = (UserVO) session.getAttribute("user");
        if (userVO == null) {
            return "您还没有登录";
        }
        return userVO.getUsername();
    }

    /**
     * 测试方法
     * {id} 表示一个占位符
     */
    @GetMapping("/users/{id}")
    public UserVO getUserById(@PathVariable("id") Integer userId) { // @PathVariable表示接收请求URL中占位符里的参数
        // 测试
        logger.info("测试数据 id: {}", userId);
        return new UserVO(1, "admin", "123456");
    }
    @DeleteMapping("/users/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT) // 返回的状态码是 204
    public String deleteUser(@PathVariable Integer id) {
        logger.info("测试数据 id: {}", id);
        return "删除成功";
    }
}
